#Boa:Dialog:Dialog1

import wx
import wx.grid
import consultasBD
import Mensaje
import sincronizar_tabla  
import utiles
from decimal import Decimal

def create(parent):
    return Dialog1(parent)

[wxID_DIALOG1, wxID_DIALOG1CANCELAR, wxID_DIALOG1GRID1, wxID_DIALOG1VOLVER, 
] = [wx.NewId() for _init_ctrls in range(4)]

class Dialog1(wx.Dialog):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_DIALOG1, name='', parent=prnt,
              pos=wx.Point(293, 149), size=wx.Size(636, 352),
              style=wx.DEFAULT_DIALOG_STYLE, title='Devolucion de Prendas')
        self.SetClientSize(wx.Size(628, 325))

        self.grid1 = wx.grid.Grid(id=wxID_DIALOG1GRID1, name='grid1',
              parent=self, pos=wx.Point(8, 8), size=wx.Size(608, 248), style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnCambiaGrid)

        self.Volver = wx.Button(id=wxID_DIALOG1VOLVER, label='Aceptar',
              name='Volver', parent=self, pos=wx.Point(448, 280),
              size=wx.Size(79, 23), style=0)
        self.Volver.Bind(wx.EVT_BUTTON, self.OnBotonAceptar,
              id=wxID_DIALOG1VOLVER)

        self.cancelar = wx.Button(id=wxID_DIALOG1CANCELAR, label='Cancelar',
              name='cancelar', parent=self, pos=wx.Point(538, 280),
              size=wx.Size(75, 23), style=0)
        self.cancelar.Bind(wx.EVT_BUTTON, self.OnBotonCancelar,
              id=wxID_DIALOG1CANCELAR)

    def __init__(self, parent, idcliente, diasconsignaciones):
        self._init_ctrls(parent)
        self.padre = parent
        self.idcliente = idcliente
        self.diasconsignaciones = diasconsignaciones
        self.sucursal = self.padre.padre.sucursalNro
        self.consignaciones = []
        self.lista = []
        self.aceptado = False
        self.cargaGrilla()

    def cargaGrilla(self):
        fechaLimite = utiles.sumarDiasLaboralesAFecha(self.diasconsignaciones)
        sql = "SELECT v.idventa,v.nrofactura,v.idformaticket,vp.ptc,vp.descri,v.fecha,vp.preciofinal,vp.cantidad,vp.talle,vp.color FROM ventas v, ventastieneproductos vp WHERE v.idcliente = '%s' AND v.idventa = vp.idticket AND vp.cantidad <> vp.devuelto AND v.fecha >= '%s' AND v.sucursal = '%s' AND v.idformaticket = '999' ORDER BY v.fecha,v.nrofactura" % (self.idcliente, fechaLimite, self.sucursal)
        resultados = consultasBD.ordenCrudaDict(sql)

        columnas =['Fecha','Nro\nFactura','PTC','Talle','Color','Descripcion','Precio\nFinal','Cantidad','Operacion\n(f o d)']
        self.grid1.CreateGrid(len(resultados), len(columnas))
        
        for i, col in enumerate(columnas): 
            self.grid1.SetColLabelValue(i, col)
            
        self.grid1.AutoSizeRow(0,True)
        self.grid1.DisableDragRowSize()
        
        for i, r in enumerate(resultados):    
            if (r["nrofactura"] != "") and ( r["idformaticket"] == 999):
                self.grid1.SetCellValue(i, 0, utiles.convertirFecha(r["fecha"])) 
                self.grid1.SetCellValue(i, 1, str(r["nrofactura"])) 
                self.grid1.SetCellValue(i, 2, str(r["ptc"]))
                self.grid1.SetCellValue(i, 3, str(r["talle"]))
                self.grid1.SetCellValue(i, 4, str(r["color"]))
                self.grid1.SetCellValue(i, 5, str(r["descri"])) 
                self.grid1.SetCellValue(i, 6, str(r["preciofinal"]))
                self.grid1.SetCellValue(i, 7, str(r["cantidad"]))
                self.lista.append(r["idventa"])

        for fil in xrange(len(resultados)):
            for col in xrange(len(columnas)-1):
                self.grid1.SetReadOnly(fil,col)

        for col in xrange(len(columnas)):
            self.grid1.AutoSizeColumn(col,True)

        self.grid1.Refresh()
            
    def OnCambiaGrid(self, event):
        fil = self.grid1.GetGridCursorRow()
        col = self.grid1.GetGridCursorCol()
        error = False
        if not self.grid1.GetCellValue(fil,col) in ["","f","F","d","D"]:
            self.grid1.SetCellValue(fil,col,"")
            error = True
        if error:
            utiles.mensaje(None,"Debe introducir 'f' o 'd'")
            return

    def getConsignaciones(self):
        return self.consignaciones

    def getAceptado(self):
        return self.aceptado

    def OnBotonCancelar(self, event):
        self.aceptado = False
        self.Close()  

    def guardar(self):
        devoluciones = []
        totalitems = 0
        items = []
        for fila in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fila,8) in ['d','D']:
                #'Fecha','Nro\nFactura','PTC','Talle','Color','Descripcion','Precio\nFinal','Cantidad'
                idventa = self.lista[fila]
                nrofactura = str(self.grid1.GetCellValue(fila,1))
                ptc = str(self.grid1.GetCellValue(fila,2))
                cantidad = Decimal(str(self.grid1.GetCellValue(fila,7)))
                listaDevolucion = {"idventa":idventa,"nrofactura":nrofactura,"ptc":ptc,"cantidad":cantidad}
                descripcion = str(self.grid1.GetCellValue(fila,5))
                items.append("- F:"+nrofactura+" PTC:"+str(ptc)+" "+descripcion+"    "+str(cantidad))
                devoluciones.append(listaDevolucion)
                totalitems += 1

        if totalitems > 0:
            sql = "SELECT nombre FROM cliente WHERE idcliente = '%s'" % (self.idcliente)
            nombre = consultasBD.ordenCrudaDict(sql)[0]['nombre']
            
            textoDevoluciones = []
            textoDevoluciones.append("*"*40)
            textoDevoluciones.append(" ")
            textoDevoluciones.append("DEVOLUCION DE CONSIGNACIONES")
            textoDevoluciones.append(utiles.getfechatoday(None))
            textoDevoluciones.append(" ")
            textoDevoluciones.append("Recibimos del cliente "+str(self.idcliente))
            textoDevoluciones.append(str(nombre))
            textoDevoluciones.append(" ")
            textoDevoluciones.append("Los siguientes productos:")
            for item in items:
                textoDevoluciones.append(item)
            textoDevoluciones.append(" ")
            textoDevoluciones.append("Total items devueltos: "+str(totalitems))
            textoDevoluciones.append(" ")
            textoDevoluciones.append("*"*40)
            
            for renglon in textoDevoluciones:
                print renglon

            #actualizando stock con las devoluciones
            for item in devoluciones:
                sql = "UPDATE ventastieneproductos SET devuelto = '%s' WHERE idticket = '%s' AND nrofactura = '%s' AND ptc = '%s'" % (item["cantidad"],item["idventa"],item["nrofactura"],item["ptc"])
                ultimoid = consultasBD.executa(None,sql)
                #obteniendo la sucursal donde se realizo la factura
                sql = "SELECT sucursal FROM ventastieneproductos WHERE idticket = '%s' AND nrofactura = '%s' AND ptc = '%s'" % (item["idventa"],item["nrofactura"],item["ptc"])
                sucursal = consultasBD.ordenCrudaDict(sql)[0]['sucursal']
                
                #recupero stock actual
                sql = "SELECT stock FROM stock WHERE ptc = '%s' AND sucursal = '%s'" % (item["ptc"],sucursal)
                stock = consultasBD.ordenCrudaDict(sql)[0]['stock']
                #incremento stock actual con lo devuelto
                nuevoStock = Decimal(str(stock)) + Decimal(str(item['cantidad']))
                #actualizo el stock del producto devuelto
                
                utiles.agregar_movimiento(item["ptc"], stock_previo= int(stock), stock_nuevo=nuevoStock, operacion='consignacion_devolucion', sucursal=sucursal)
                
                sql = "UPDATE stock SET stock = '%s' WHERE ptc = '%s' AND sucursal = '%s'" % (nuevoStock,item["ptc"],sucursal)                
                
                sincronizar_tabla.addChange(sql=sql)
                consultasBD.executaSinCommit(None, sql)                                  

        consignaciones = []
        for fila in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fila,8) in ['f','F']:
                #'Fecha','Nro\nFactura','PTC','Talle','Color','Descripcion','Precio\nFinal','Cantidad'
                idventa = self.lista[fila]
                nrofactura = str(self.grid1.GetCellValue(fila,1))
                ptc = str(self.grid1.GetCellValue(fila,2))
                talle = str(self.grid1.GetCellValue(fila,3))
                color = str(self.grid1.GetCellValue(fila,4))
                descripcion = str(self.grid1.GetCellValue(fila,5))
                cantidad = Decimal(str(self.grid1.GetCellValue(fila,7)))
                
                #necesito el codigo sussan
                sql = "SELECT codsussan FROM producto_talle_color WHERE id = '%s'" % (ptc)
                codsussan = str(consultasBD.ordenCrudaDict(sql)[0]['codsussan'])
                #necesito preciolista y descuento
                sql = "SELECT preciolista,descuento FROM ventastieneproductos WHERE ptc = '%s' AND idticket = '%s'" % (ptc,idventa)
                resultado = consultasBD.ordenCrudaDict(sql)
                preciolista = str(resultado[0]['preciolista'])
                descuento = str(resultado[0]['descuento'])
                
                listaFacturacion = {"idventa":idventa,"nrofactura":nrofactura,"ptc":ptc,"cantidad":cantidad,"codigo":codsussan,"talle":talle,"color":color,"preciolista":preciolista,"descuento":descuento,"descri":descripcion}
                consignaciones.append(listaFacturacion)

        if consignaciones != []:
            self.consignaciones = consignaciones
            self.aceptado = True
        

    def OnBotonAceptar(self, event):
        try:
            consultasBD.begin()
            self.guardar()            
            consultasBD.commit()
            sincronizar_tabla.syncServerTables(self, ["stock"])
            #utiles.mensaje(self, "La compra se guardo y sincronizo correctamente")            
            utiles.mensaje(self, "La consignacion fue exitosa")            
            
            self.Close()
 
        except sincronizar_tabla.SyncError:
            utiles.mensaje(self, "La consignacion fue exitosa \n pero no termino de transmitirse por favor realize un sincronizacion")    
        except Exception, e:
            import traceback
            import sys
            exc_type, exc_value, exc_tb = sys.exc_info()
            traceback.print_exception(exc_type, exc_value, exc_tb)
            print e.__str__()
            utiles.mensaje(self, "Fallo la consignacion")    
            consultasBD.rollback() 